package com.itany.corejava.util;

/**
 * @author MissChen
 * @date 2024年03月04日 11:07
 */

import java.util.Arrays;

/**
 *
 * 定义一个数组的排序方法,根据实际传递的数组类型不同,排序的规则也不同
 * 定义时只定义排序规则,不做具体实现。在调用时,使用匿名内部类进行具体的实现
 * 例如:
 *  如果传递的是数字,则根据数值大小进行降序排序。
 *  如果传递的是字符串,则根据字符串长度进行升序排序

 **/
public class SortUtil {
    public static void main(String[] args) {
        //对数组进行排序
        Integer[] nums={18,5,4,9,11,2,7};
        SortUtil.sort(nums, new SortCompareInterface<Integer>() {
            @Override
            public int compareTo(Integer t1, Integer t2) {
                return t2-t1;
            }
        });
        System.out.println(Arrays.toString(nums));

        String[] names={"admin","jack","tom","alicebaby","bab","a"};
        SortUtil.sort(names, new SortCompareInterface<String>() {
            @Override
            public int compareTo(String t1, String t2) {
                return t1.length()-t2.length();
            }
        });
        System.out.println(Arrays.toString(names));
    }

    public static <T> void sort(T[] arr,SortCompareInterface sc){
        // 对于主体内容在该方法中实现
        // 对于关键步骤，在调用时候通过匿名内部类进行实现
        // 关键步骤:
        // 如果传递的是数字,则根据数值大小进行降序排序。
        // 如果传递的是字符串,则根据字符串长度进行升序排序

        //外层循环控制比较的轮数
        for(int i=1;i<arr.length;i++){
            //内层循环控制比较每轮比较的次数
            for(int j=0;j<arr.length-i;j++){
                int result=sc.compareTo(arr[j],arr[j+1]);
                if(result>0){//说明arr[j]比arr[j+1]
                    T temp=arr[j+1];
                    arr[j+1]=arr[j];
                    arr[j]=temp;

                }
            }
        }

    }
}
